package jmine.tec.rpc.common.provider;

import jmine.tec.rpc.common.entity.EntityRepresentation;
import jmine.tec.rpc.common.entity.EntityRest;

/**
 * Objeto que provê acesso a serviços REST.
 * 
 * @author lundberg
 */
public interface RestServiceProvider {

    /**
     * Obtém uma implementação do serviço
     * 
     * @param <S> tipo de serviço
     * @param service classe do serviço
     * @return service
     */
    <S> S provideByClass(Class<S> service);

    /**
     * Obtém uma implementação do serviço que provê acesso a uma representação
     * 
     * @param <R> tipo de representação
     * @param representation classe da representação
     * @return service
     */
    <R extends EntityRepresentation> EntityRest<R> provideByRepresentation(Class<R> representation);

    /**
     * Verifica se existe serviço de acesso à representação registrado
     * 
     * @param <R> tipo de representação
     * @param representation classe da representação
     * @return boolean
     */
    <R extends EntityRepresentation> boolean providesByRepresentation(Class<R> representation);
}
